home *** CD-ROM | disk | FTP | other *** search
/ SPACE 1 / SPACE - Library 1 - Volume 1.iso / program / 569 / rsctools / c_rsh.skl next >
Text File  |  1992-06-01  |  9KB  |  312 lines

  1. /* This is a skeleton file for use with rsh.ttp and Lattice C 5.
  2.  *
  3.  * It replaces rsrc_load, rsrc_free, rsrc_gaddr, and optionally rsrc_saddr.
  4.  * I've never found the latter function useful, but if for some reason
  5.  * you need it, define the preprocessor symbol `MAKE_RSRC_SADDR'.
  6.  *
  7.  * Note that many types besides R_TREE, R_FRIMG, and R_FRSTR are defined
  8.  * for rsrc_gaddr and rsrc_saddr in the ROMs.  However, these additional
  9.  * types aren't supported here, because they are in general quite useless,
  10.  * since existing RCS programs don't, for example, allow naming of TEDINFOs
  11.  * (you name the _object_, not the TEDINFO structure).
  12.  *
  13.  * Author: Doug Harrison
  14.  * Copyright (c) 1991 Doug Harrison.
  15.  */
  16.  
  17. /* Lattice C 5 #defines several AES functions into direct calls to `_AESif'
  18.  * and any necessary setup code.  I don't see any particular advantage to
  19.  * this (contrast to #pragma inline) in general, and since we're replacing
  20.  * functions that may be #defined, we must suppress this.  The easiest
  21.  * way to accomplish this is to add a "#define __NO_AES_DEFINES" statement
  22.  * to the beginning of aes.h, which is what I recommend.  Or, you could
  23.  * always add "-d__NO_AES_DEFINES" to your LC_OPT environment variable.
  24.  * Whatever you decide, be aware that you _must_ suppress the preprocessor
  25.  * redefinition of the functions this module replaces; otherwise, when your
  26.  * program references one of these functions, you will get the preprocessor
  27.  * definition and not the intended replacement!
  28.  *
  29.  * Here, we #define __NO_AES_DEFINES, and as long as it hasn't been #defined
  30.  * to a _value_ in LC_OPT or directly on the command line, there's no need
  31.  * to #undef it or see if it's already defined (ANSI permits redefinition
  32.  * of preprocessor symbols as long as all definitions are identical, down
  33.  * to whitespace).
  34.  *
  35.  * Note: I believe __NO_AES_DEFINES was added to Lattice 5.06, so if you're
  36.  * using an earlier version, you should make sure that aes.h is actually
  37.  * using this symbol, and if not, take whatever steps are necessary to
  38.  * ensure rsrc_load, etc. are not #defined (do something like add statements
  39.  * "#undef rsrc_load" to the end of aes.h for whatever functions we replace
  40.  * here).
  41.  */
  42.  
  43. /* Note: since the original version, I've made some changes that allow
  44.  * this program to be compiled with Mark Williams C.  Lattice C defines
  45.  * the symbol `LATTICE' automatically, so we use it for the conditional
  46.  * compilation.  If LATTICE isn't defined, we assume a pre-ANSI C compiler
  47.  * and obdefs.h and gemdefs.h as the include files.
  48.  */
  49.  
  50. #if defined LATTICE
  51.  
  52. #define __NO_AES_DEFINES
  53.  
  54. #include <aes.h>
  55.  
  56. /* Make sure none of the following are #defined in versions earlier than
  57.  * Lattice 5.06.  You still need to take steps to ensure this in your other
  58.  * source files.
  59.  */
  60.  
  61. #undef rsrc_load
  62. #undef rsrc_free
  63. #undef rsrc_gaddr
  64. #undef rsrc_saddr
  65.  
  66. /* You may need to alter the following typedef...  My aes.h uses unsigned
  67.  * long for the type of ob_spec, but the Lattice default is void *, so
  68.  * that's the default here as well.
  69.  */
  70.  
  71. typedef void *ObSpecType;
  72.  
  73. #define VOID__    void
  74. #define CONST__   const
  75.  
  76. #else
  77.  
  78. /* Since Lattice isn't defined, assume a pre-ANSI compiler. */
  79.  
  80. #include <obdefs.h>
  81. #include <gemdefs.h>
  82.  
  83. typedef unsigned long ObSpecType;
  84.  
  85. /* VOID__ is our type for a void pointer. */
  86. #define VOID__    char
  87. #define CONST__
  88.  
  89. #endif
  90.  
  91. /* This type saves me some typing :-) */
  92.  
  93. typedef unsigned long ulong;
  94.  
  95. /* Convenient macros to return the OBJECT fields. */
  96.  
  97. #define OB_NEXT(tree,obj)  ((tree)[obj].ob_next)
  98. #define OB_HEAD(tree,obj)  ((tree)[obj].ob_head)
  99. #define OB_TAIL(tree,obj)  ((tree)[obj].ob_tail)
  100. #define OB_TYPE(tree,obj)  ((tree)[obj].ob_type)
  101. #define OB_STATE(tree,obj) ((tree)[obj].ob_state)
  102. #define OB_FLAGS(tree,obj) ((tree)[obj].ob_flags)
  103. #define OB_SPEC(tree,obj)  ((tree)[obj].ob_spec)
  104. #define OB_X(tree,obj)     ((tree)[obj].ob_x)
  105. #define OB_Y(tree,obj)     ((tree)[obj].ob_y)
  106. #define OB_W(tree,obj)     ((tree)[obj].ob_width)
  107. #define OB_H(tree,obj)     ((tree)[obj].ob_height)
  108.  
  109.  
  110.  
  111. /* Rsh inserts its output by replacing the %% token. */
  112.  
  113. %%
  114.  
  115.  
  116.  
  117. /* Replacement functions follow.  I've used old style C definitions for
  118.  * compatibility reasons, but since we've #included aes.h for Lattice C,
  119.  * our prototypes are in scope (this is critical when compiling with -rr).
  120.  */
  121.  
  122.  
  123.  
  124. int
  125. rsrc_load(name)
  126.    CONST__ char
  127.       *name;
  128. {
  129.    int
  130.       i;    /* Tracks the tree, object, free string, or free images. */
  131.    ulong
  132.       idx;  /* Value of an entry in one of the index arrays, specific to
  133.                the entity we're considering. */
  134.  
  135.    /* Only include the code we require (as far as we can determine, that
  136.     * is).  Note that I've followed the DRI RCS lead of making the type of
  137.     * the index arrays long; of course, it should be unsigned long, since
  138.     * the indexes can never be negative (but this is admittedly being
  139.     * pedantic, since the indexes can never grow large enough to overflow
  140.     * a signed long).
  141.     */
  142.  
  143. #if NUM_TREE
  144.  
  145.    for (i = 0; i < NUM_TREE; i++)
  146.       rs_trindex[i] = (long) (rs_object+(ulong) rs_trindex[i]);
  147.  
  148.    /* If we have some trees, it follows that we have some objects. */
  149.  
  150.    for (i = 0; i < NUM_OBS; i++) {
  151.  
  152.       /* Fix up object coordinates. */
  153.       rsrc_obfix(rs_object,i);
  154.  
  155.       idx = (ulong) OB_SPEC(rs_object,i);
  156.  
  157.       switch (OB_TYPE(rs_object,i) & 0xff) {
  158. #if NUM_STRINGS
  159.          case G_STRING :
  160.          case G_BUTTON : 
  161.          case G_TITLE :
  162.             OB_SPEC(rs_object,i) = (ObSpecType) rs_strings[idx];
  163.             break;
  164. #endif
  165. #if NUM_TI
  166.          case G_TEXT :
  167.          case G_BOXTEXT :
  168.          case G_FBOXTEXT :
  169.          case G_FTEXT : {
  170.             TEDINFO
  171.                *ted = rs_tedinfo+idx;
  172.  
  173.             OB_SPEC(rs_object,i) = (ObSpecType) ted;
  174.             ted->te_ptext = rs_strings[(ulong) ted->te_ptext];
  175.             ted->te_ptmplt = rs_strings[(ulong) ted->te_ptmplt];
  176.             ted->te_pvalid = rs_strings[(ulong) ted->te_pvalid];
  177.             break;
  178.          }
  179. #endif
  180. #if NUM_BB
  181.          case G_IMAGE : {
  182.             BITBLK
  183.                *bb = rs_bitblk+idx;
  184.  
  185.             OB_SPEC(rs_object,i) = (ObSpecType) bb;
  186.             bb->bi_pdata = rs_imdope[(ulong) bb->bi_pdata].image;
  187.             break;
  188.          }
  189. #endif
  190. #if NUM_IB
  191.          case G_ICON : {
  192.             ICONBLK
  193.                *ib = rs_iconblk+idx;
  194.  
  195.             OB_SPEC(rs_object,i) = (ObSpecType) ib;
  196.             ib->ib_pmask = rs_imdope[(ulong) ib->ib_pmask].image;
  197.             ib->ib_pdata = rs_imdope[(ulong) ib->ib_pdata].image;
  198.             ib->ib_ptext = rs_strings[(ulong) ib->ib_ptext];
  199.             break;
  200.          }
  201. #endif
  202.          default :
  203.             break;
  204.       }
  205.    }
  206. #endif
  207.  
  208. #if NUM_FRSTR
  209.    /* This fixes up the array of pointers to free strings. */
  210.    for (i = 0; i < NUM_FRSTR; i++)
  211.       rs_frstr[i] = (long) (rs_strings[(ulong) rs_frstr[i]]);
  212. #endif
  213.  
  214. #if NUM_FRIMG
  215.    /* This fixes up the array of pointers to free images (a free image is
  216.     * in actuality a BITBLK and is found in the `rs_bitblk' array).
  217.     */
  218.    for (i = 0; i < NUM_FRIMG; i++) {
  219.       BITBLK
  220.          *bb = rs_bitblk+(ulong) rs_frimg[i];
  221.  
  222.       rs_frimg[i] = (long) bb;
  223.       bb->bi_pdata = rs_imdope[(ulong) bb->bi_pdata].image;
  224.    }
  225. #endif
  226.  
  227.    /* We always win. */
  228.    return 1;
  229. } /* rsrc_load */
  230.  
  231.  
  232.  
  233. int
  234. rsrc_gaddr(type,index,p)
  235.    int
  236.       type,index;
  237.    VOID__
  238.       *p;
  239. {
  240.    switch (type) {
  241. #if NUM_TREE
  242.       case R_TREE :
  243.          *(OBJECT **) p = (OBJECT *) rs_trindex[index];
  244.          break;
  245. #endif
  246. #if NUM_FRSTR
  247.       case R_FRSTR :
  248.          *(char **) p = (char *) rs_frstr[index];
  249.          break;
  250. #endif
  251. #if NUM_FRIMG
  252.       case R_FRIMG :
  253.          *(BITBLK **) p = (BITBLK *) rs_frimg[index];
  254.          break;
  255. #endif
  256.       default :
  257.          /* If we get here, an error occurred.  So set `p' to NULL to
  258.           * cause a predictable bus error if the entity address is
  259.           * subsequently used.
  260.           */
  261.          *(char **) p = (char *) 0;
  262.          return 0;
  263.    }
  264.  
  265.    return 1;
  266. } /* rsrc_gaddr */
  267.  
  268.  
  269.  
  270. int
  271. rsrc_free()
  272. {
  273.    /* We always win. */
  274.    return 1;
  275. } /* rsrc_free */
  276.  
  277.  
  278.  
  279. #if defined MAKE_RSRC_SADDR
  280.  
  281. int
  282. rsrc_saddr(type,index,p)
  283.    int
  284.       type,index;
  285.    VOID__
  286.       *p;
  287. {
  288.    switch (type) {
  289. #if NUM_TREE
  290.       case R_TREE :
  291.          rs_trindex[index] = (long) p;
  292.          break;
  293. #endif
  294. #if NUM_FRSTR
  295.       case R_FRSTR :
  296.          rs_frstr[index] = (long) p;
  297.          break;
  298. #endif
  299. #if NUM_FRIMG
  300.       case R_FRIMG :
  301.          rs_frimg[index] = (long) p;
  302.          break;
  303. #endif
  304.       default :
  305.          return 0;
  306.    }
  307.  
  308.    return 1;
  309. } /* rsrc_saddr */
  310.  
  311. #endif
  312.